import store from '@/store';
import { Toast } from 'antd-mobile';
import axios from 'axios';
import history from './history';
import { getTokenInfo, setTokenInfo } from './storage';

// 请求基地址
export const baseURL = 'http://geek.itheima.net';

// 创建 axios 实例
const http = axios.create({
  baseURL: baseURL,
  timeout: 5000,
});

// 请求拦截器
http.interceptors.request.use(
  // 最后一环:使用any类型
  function (config: any) {
    const { token } = getTokenInfo();
    if (token) {
      config.headers.Authorization = `Bearer ${token}`;
    }
    return config;
  },
  function (error) {
    return Promise.reject(error);
  }
);

// 响应拦截器
http.interceptors.response.use(
  function (response) {
    return response.data;
  },
  function (error) {
    console.dir(error);
    // 情况1 ： 断网时，我们要提示用户断网了，网络有问题
    if (!error.response) {
      Toast.show({ content: '网络有问题，请检查网络' });
      return Promise.reject(error);
    }
    // 情况2：非401 非断网情况（token改了。。） 统一抛出后台给的错误提示
    if (error.response.status !== 401) {
      Toast.show({ content: error.response.data.message });
      return Promise.reject(error);
    }
    // ：token失效
    const { refresh_token } = getTokenInfo();
    // 401 分俩种情况 无token和无refresh_token
    // 1.无token
    // 💥 此时已经是401的情况，如果token存在，判断refresh_token，如果token不存在，还是判断refresh_token
    // if (!token) {
    //   Toast.show({ content: '登录超时，请重新登录' });
    //   history.push('/login');
    //   return Promise.reject(error);
    // }
    // 2.token有值，但是不存在refresh_token，还是得重定向
    if (!refresh_token) {
      Toast.show({ content: '登录超时，请重新登录' });
      history.push('/login');
      return Promise.reject(error);
    }
    // 3.token有值，refresh_token也有值 ,此时 使用refresh_token获取新token
    // 准备处理无感刷新
    try {
      axios({
        url: '/v1_0/authorizations',
        method: 'put',
        data: refresh_token,
        headers: {
          Authorization: 'Bearer ' + refresh_token,
        },
      }).then((res) => {
        console.log('res  ----->  ', res);
        const auth = {
          token: res.data.data.token,
          refresh_token,
        };
        setTokenInfo(auth);
        store.dispatch({ type: 'user/login', payload: auth });
        return error.config;
      });
    } catch (error) {
      history.push('/login');
      Toast.show({ content: '登录超时，请重新登录' });
      return Promise.reject(error);
    }

    // // 情况3 401错误，提示用户登录过去的问题
    // Toast.show({ content: '登录超时，请重新登录' });
    // return Promise.reject(error);
  }
);

// 导出 axios 实例
export default http;
